//验证权限的最好用的方式
import passport from 'koa-passport'
import LocalString from 'passport-local'
import UserModel from '../../dbs/models/users'

passport.use(new LocalString(async function (username, password, done) {
  //设置查询条件配置
  //注意这里的username/password 在登录接口传递参数的时候字段名(参数名)一定要一致 passport策略规定的
  //意思就是说 关于登录接口中接受的参数 字段名只能是username和password
  //done回调对应的三个参数 第一个error代表系统异常。 如果存在就代表系统异常 比如数据库不存在
  //第二个参数代表逻辑上的 如果为false，则代表登录失败 逻辑上的登录失败(比如密码错误之类)
  //第三个参数代表具体的错误信息 
  //这个done就相当于 登录接口中的回调 第三个参数会传递给info 第二个会传给user 第一个会传给err
  //也就是登录的时候使用return Passport.authenticate()这个方法 也就是相当于进入了这里的验证
  //验证通过的时候这个策略 return done(null, result) 第一个不存在null 第二个正确返回不为false
  let where = {
    username
  };
  let result = await UserModel.findOne(where)
  //对应用户名存在
  if (result != null) {
    //数据库中find出来的是一条数据 也就是一个对象  密码相等 第二个参数为true就可以正确登录
    //done中第三个参数 为返回的错误信息
    if (result.password === password) {
      return done(null, result)
    } else {
      return done(null, false, '密码错误')
    }
  }else{
      return done(null,false,'用户不存在')
  }
}))

//固定用法 登录验证成功，把这个数据打到cookies中。http通信是没有状态的，不存在session中
//session是存储在cookise中放在浏览器端的
//下次在进入页面的时候会从session中把cookise取出来和服务端的session验证


//为passport添加全局属性 序列化 反序列化
//序列化 登录 用户每次登陆都通过session验证
passport.serializeUser(function(user,done){
    done(null,user)
})

//反序列化 每次请求会从session中读取用户对象
passport.deserializeUser(function(user,done){
    done(null,user)
})

export default passport
